﻿#include "frame.h"

IMPLEMENT_DYNCREATE(GLDoc, CDocument)
IMPLEMENT_DYNCREATE(GLView, CView)
IMPLEMENT_DYNCREATE(GLFrame, CFrameWnd)

BEGIN_MESSAGE_MAP(GLView, CView)
ON_WM_PAINT()
ON_WM_CREATE()
ON_WM_DESTROY()
ON_WM_TIMER()
END_MESSAGE_MAP()

BEGIN_MESSAGE_MAP(GLFrame, CFrameWnd)
ON_COMMAND(ID_Open, &GLFrame::OnOpen)
ON_COMMAND(ID_Save, &GLFrame::OnSave)
ON_COMMAND(ID_Undo, &GLFrame::OnUndo)
ON_COMMAND(ID_Recover, &GLFrame::OnRecover)
ON_COMMAND(ID_Copy, &GLFrame::OnCopy)
ON_COMMAND(ID_Paste, &GLFrame::OnPaste)
ON_COMMAND(ID_Delete, &GLFrame::OnDelete)
ON_COMMAND(ID_Point, &GLFrame::OnPoint)
ON_COMMAND(ID_Segment, &GLFrame::OnSegment)
ON_COMMAND(ID_Circle, &GLFrame::OnCircle)
ON_COMMAND(ID_Ellipse, &GLFrame::OnEllipse)
ON_COMMAND(ID_Triangle, &GLFrame::OnTriangle)
ON_COMMAND(ID_Rectangle, &GLFrame::OnRectangle)
ON_COMMAND(ID_Plane, &GLFrame::OnPlane)
ON_COMMAND(ID_CurveBezier, &GLFrame::OnCurvebezier)
ON_COMMAND(ID_CurveBSpline, &GLFrame::OnCurvebspline)
ON_COMMAND(ID_SurfaceBezier, &GLFrame::OnSurfacebezier)
ON_COMMAND(ID_SurfaceBSpline, &GLFrame::OnSurfacebspline)
ON_COMMAND(ID_FFD, &GLFrame::OnFfd)
ON_COMMAND(ID_ShadeMode, &GLFrame::OnShademode)
END_MESSAGE_MAP()

void GLView::OnDraw(CDC *pDC)
{
    if (m_context)
    {
        // 设置视口大小
        CRect rect;
        GetClientRect(&rect);

        // 绘图上下文
        m_context->draw(rect.Width(), rect.Height());
    }
}

std::shared_ptr<Context> GLView::CreateContext(int width, int height)
{
    m_context = std::make_shared<Context>((int)m_hWnd, width, height);
    return m_context;
}

void GLView::OnPaint()
{
    try
    {
        CPaintDC dc(this); // 创建用于绘制的设备上下文
        OnDraw(&dc);       // 调用 OnDraw 绘制内容
    }
    catch (...)
    {
        std::cerr << "GLView::OnPaint error" << std::endl;
    }
}

int GLView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
    if (CView::OnCreate(lpCreateStruct) == -1)
        return -1;

    // 定时器 60 帧
    SetTimer(1, 1000 / 60, NULL);

    return 0;
}

void GLView::OnDestroy()
{
    CView::OnDestroy();

    // 销毁定时器
    KillTimer(1);
}

void GLView::OnTimer(UINT_PTR nIDEvent)
{
    // 触发刷新
    ::InvalidateRect(this->m_hWnd, NULL, FALSE);

    CView::OnTimer(nIDEvent);
}

void GLFrame::OnOpen()
{
    // TODO: 在此添加命令处理程序代码
}

void GLFrame::OnSave()
{
    // TODO: 在此添加命令处理程序代码
}

void GLFrame::OnUndo()
{
    // TODO: 在此添加命令处理程序代码
}

void GLFrame::OnRecover()
{
    // TODO: 在此添加命令处理程序代码
}

void GLFrame::OnCopy()
{
    // TODO: 在此添加命令处理程序代码
}

void GLFrame::OnPaste()
{
    // TODO: 在此添加命令处理程序代码
}

void GLFrame::OnDelete()
{
    // TODO: 在此添加命令处理程序代码
}

void GLFrame::OnPoint()
{
    // TODO: 在此添加命令处理程序代码
}

void GLFrame::OnSegment()
{
    // TODO: 在此添加命令处理程序代码
}

void GLFrame::OnCircle()
{
    // TODO: 在此添加命令处理程序代码
}

void GLFrame::OnEllipse()
{
    // TODO: 在此添加命令处理程序代码
}

void GLFrame::OnTriangle()
{
    // TODO: 在此添加命令处理程序代码
}

void GLFrame::OnRectangle()
{
    // TODO: 在此添加命令处理程序代码
}

void GLFrame::OnPlane()
{
    // TODO: 在此添加命令处理程序代码
}

void GLFrame::OnCurvebezier()
{
    // TODO: 在此添加命令处理程序代码
}

void GLFrame::OnCurvebspline()
{
    // TODO: 在此添加命令处理程序代码
}

void GLFrame::OnSurfacebezier()
{
    // TODO: 在此添加命令处理程序代码
}

void GLFrame::OnSurfacebspline()
{
    // TODO: 在此添加命令处理程序代码
}

void GLFrame::OnFfd()
{
    // TODO: 在此添加命令处理程序代码
}

void GLFrame::OnShademode()
{
    // TODO: 在此添加命令处理程序代码
}